<html>
<head>
  <title>Evernote Export</title>
  <basefont face="微软雅黑" size="2" />
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  <meta name="exporter-version" content="YXBJ Windows/602498 (zh-CN, DDL); Windows/10.0.0 (Win64); EDAMVersion=V2;"/>
  <style>
    body, td {
      font-family: 微软雅黑;
      font-size: 10pt;
    }
  </style>
</head>
<body>
<a name="568"/>

<div>
<span><div><div>SpringMVC： MVC是软件工程中的一种软件架构模式，它是一种分离业务逻辑与显示界面的开发思想。</div><div>M： model模型：处理业务逻辑，封装实体</div><div>V： view 视图：展示内容</div><div>C： controller 控制器：负责调度分发（1.接收请求、2.调用模型、3.转发到视图）</div><div><br/></div><div>概述： </div><div><span>    </span>1.SpringMVC 是一种基于 Java 的实现 MVC 设计模式的轻量级 Web 框架，属于SpringFrameWork 的 后续产品，已经融合在 Spring Web Flow 中。</div><ol start="2"><li><div>SpringMVC 已经成为目前最主流的MVC框架之一，并且随着Spring3.0 的发布，全面超越 Struts2， 成为最优秀的 MVC 框架。它通过一套注解，让一个简单的 Java 类成为处理请求的控制器，而无须实现 任何接口。同时它还支持 RESTful 编程风格的请求。</div></li></ol><div><br/></div><div>总结： SpringMVC的框架就是封装了原来Servlet中的共有行为；例如：参数封装，视图转发等。</div><div><br/></div><div><br/></div><div>SpringMVC快速入门：需求是： 客户端发起请求，服务器接收请求，执行逻辑并进行视图跳转。</div><div>步骤分析：</div><ol><li><div>创建web项目，导入SpringMVC相关坐标</div></li><li><div>配置SpringMVC前端控制器 DispathcerServlet</div></li><li><div>编写Controller类和视图页面</div></li><li><div>使用注解配置Controller类中业务方法的映射地址</div></li><li><div>配置SpringMVC核心文件 spring-mvc.xml</div></li></ol><div><br/></div><div>SpringMVC是对MVC设计模式的一种实现，属于轻量级的WEB框架。</div><div><br/></div><div><br/></div><div><br/></div><div>SpringMVC组件</div><div><br/></div><div>SpringMVC的执行流程</div><ol><li><div>用户发送请求至前端控制器DispatcherServlet。</div></li><li><div>DispatcherServlet收到请求调用HandlerMapping处理器映射器。</div></li><li><div>处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找)，生成处理器对象及处理器拦截器(如 果有则生成)一并返回给DispatcherServlet。</div></li><li><div>DispatcherServlet调用HandlerAdapter处理器适配器。</div></li><li><div>HandlerAdapter经过适配调用具体的处理器(Controller，也叫后端控制器)。</div></li><li><div>Controller执行完成返回ModelAndView。</div></li><li><div>HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。</div></li><li><div>DispatcherServlet将ModelAndView传给ViewReslover视图解析器。</div></li><li><div>ViewReslover解析后返回具体View。</div></li><li><div>DispatcherServlet根据View进行渲染视图（即将模型数据填充至视图中）。</div></li><li><div>DispatcherServlet将渲染后的视图响应响应用户。</div></li></ol><div><br/></div><div><br/></div><div>SpringMVC组件解析：</div><ol><li><div><font style="color: rgb(255, 0, 0);">前端控制器：DispatcherServlet</font><font>：</font> 用户请求到达前端控制器，它就相当于 MVC 模式中的 C，DispatcherServlet 是整个流程控制的 中心，由它调用其它组件处理用户的请求，DispatcherServlet 的存在降低了组件之间的耦合性。</div></li><li><div><font style="color: rgb(255, 0, 0);">处理器映射器：HandlerMapping</font><font>:</font> HandlerMapping 负责根据用户请求找到 Handler 即处理器，SpringMVC 提供了不同的映射器 实现不同的映射方式，例如：配置文件方式，实现接口方式，注解方式等。</div></li><li><div><font style="color: rgb(255, 0, 0);">处理器适配器：HandlerAdapter</font><font>:</font> 通过 HandlerAdapter 对处理器进行执行，这是适配器模式的应用，通过扩展适配器可以对更多类型 的处理器进行执行。</div></li><li><div><font style="color: rgb(255, 0, 0);">处理器：Handler【**开发者编写**】</font><font>:</font> 它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。</div></li><li><div><font style="color: rgb(255, 0, 0);">视图解析器：ViewResolver</font><font>:</font> View Resolver 负责将处理结果生成 View 视图，View Resolver 首先根据逻辑视图名解析成物 理视图名，即具体的页面地址，再生成 View 视图对象，最后对 View 进行渲染将处理结果通过页面展示给 用户。</div></li><li><div><font style="color: rgb(255, 0, 0);">视图：View 【**开发者编写**】</font><font>:</font> SpringMVC 框架提供了很多的 View 视图类型的支持，包括：jstlView、freemarkerView、 pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展 示给用户，需要由程序员根据业务需求开发具体的页面。</div></li></ol><div><br/></div><div><font style="color: rgb(255, 0, 0);"><b>springmvc的三大组件 ：处理器映射器，处理器适配器，视图解析器，如果是说四大组件就加上一个前端控制器</b></font></div><div><br/></div><div><br/></div><div><br/></div><div>SpringMVC注解解析:</div><ol><li><div><span style="color: rgb(255, 0, 0);">@Controller</span> : SpringMVC基于Spring容器，所以在进行SpringMVC操作时，需要将Controller存储到Spring容器 中，如果使用@Controller注解标注的话，就需要使用<font color="#FF0000" style="font-family: unset; font-size: unset;">&lt;</font> <font color="#FF0000" style="font-family: unset; font-size: unset;">context:component-scan base-package=&quot;com.lagou.controller&quot;/ &gt;</font></div></li><li><div><span style="color: rgb(255, 0, 0);">@RequestMapping</span>:作用： 用于建立请求 URL 和处理请求方法之间的对应关系</div></li></ol><div><span>    </span><span>    </span><span>    位置：</span><br/></div><ol><ol><li><div>类上：请求URL的第一级访问目录。此处不写的话，就相当于应用的根目录。写的话需要以/开头。</div></li><li><div>方法上：请求URL的第二级访问目录，和一级目录组成一个完整的 URL 路径。</div></li></ol></ol><div><span>    </span><span>    </span><span>    属性：</span><br/></div><ol><ol><li><div>value：用于指定请求的URL。它和path属性的作用是一样的</div></li><li><div>method：用来限定请求的方式</div></li><li><div>params：用来限定请求参数的条件：eg: params={&quot;accountName&quot;} 表示请求参数中必须有accountName    pramss={&quot;money!100&quot;} 表示请求参数中money不能是100</div></li></ol></ol><div><br/></div><div><br/></div><div><br/></div><div><font color="#FF0000"><span><br/></span></font></div><div>SpringMVC的请求</div><div><br/></div><div>请求参数类型介绍</div><div>客户端请求参数的格式是： name=value&amp;name=value……</div><div>服务器要获取请求的参数的时候要进行类型转换，有时还需要进行数据的封装</div><div>SpringMVC可以接收如下类型的参数：</div><ol><li><div>基本类型参数</div></li><li><div><span style="color: unset; font-family: unset; font-size: unset;">对象类型参数</span></div></li><li><div>数组类型参数</div></li><li><div>集合类型参数</div></li></ol><div><br/></div><div><font style="color: rgb(255, 0, 0);">获取基本类型参数</font>： Controller中的业务方法的参数名称要与请求参数的name一致，参数值会自动映射匹配。并且能自 动做类型转换；自动的类型转换是指从String向其他类型的转换。</div><div><font style="color: rgb(255, 0, 0);">获取对象类型参数</font>： Controller中的业务方法参数的POJO属性名与请求参数的name一致，参数值会自动映射匹配。</div><div><font style="color: rgb(255, 0, 0);">获取数组类型参数</font>： Controller中的业务方法数组名称与请求参数的name一致，参数值会自动映射匹配。</div><div><font style="color: rgb(255, 0, 0);">获取集合（复杂）类型参数</font>： 获得集合参数时，要将集合参数包装到一个POJO中才可以。</div><div><br/></div><div><br/></div><div>自定义类型转换器： SpringMVC 默认已经提供了一些常用的类型转换器；例如：客户端提交的字符串转换成int型进行参 数设置，日期格式类型要求为：yyyy/MM/dd 不然的话会报错，对于特有的行为，SpringMVC提供了自 定义类型转换器方便开发者自定义处理。</div><div><br/></div><div>相关注解： @RequestParam： 当请求的参数name名称与Controller的业务方法参数名称不一致时，就需要通过@RequestParam注 解显示的绑定</div><div>@RequestHeader： 获取请求头的数据。</div><div>@ CookieValue： 获取cookie中的数据。</div><div><br/></div><div>获取Servlet相关API： SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入：编写一个servlet类在方法上添加 @RequestMapping(&quot;/servletAPI&quot;) 注解</div><div><br/></div><div><br/></div><div>SpringMVC的响应</div><div><br/></div><div>SpringMVC响应方式介绍：</div><div>页面跳转：</div><ol><li><div>返回字符串逻辑视图</div></li><li><div>void原始ServletAPI</div></li><li><div>ModelAndView</div></li></ol><div><br/></div><div>返回数据方法：</div><ol><li><div>直接返回字符串数据</div></li><li><div>将对象或集合转为json返回</div></li></ol><div><br/></div><div><br/></div><div>返回字符串逻辑视图： 直接返回字符串：此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转到指定页面</div><div><br/></div><div><br/></div><div>转发和重定向：实际开发一般使用返回字符串逻辑视图实现页面的跳转，该方式其实就是请求转发。</div><div>我们也可以写成：forward转发： 如果用了forward：则路径必须写成实际视图url，不能写逻辑视图。</div><div>使用请求转发，既可以转发到jsp，也可以转发到其他的控制器方法。</div><div><b><font style="color: rgb(255, 0, 0);">Redirect重定向</font></b>：<span style="color: unset; font-family: unset; font-size: unset;">我们可以不写虚拟目录，springMVC框架会自动拼接，并且将Model中的数据拼接到url地址上</span></div><div><span style="color: unset; font-family: unset; font-size: unset;"><br/></span></div><div>ModelAndView</div><div>方式一： 在Controller中方法创建并返回ModelAndView对象，并且设置视图名称</div><div><br/></div><div>方式二： 在Controller中方法形参上直接声明ModelAndView，无需在方法中自己创建，在方法中直接使用该 对象设置视图，同样可以跳转页面</div><div><br/></div><div><br/></div><div><br/></div><div><font style="color: rgb(255, 0, 0);">@SessionAttributes</font>： 如果在多个请求之间共用数据，则可以在控制器类上标注一个 @SessionAttributes,配置需要在 session中存放的数据范围，Spring MVC将存放在model中对应的数据暂存到 HttpSession 中。 <font style="color: rgb(255, 0, 0);">注意： @SessionAttributes(&quot;xxx&quot;)只能定义在类上</font></div><div><font style="color: rgb(255, 0, 0);"><br/></font></div><div>知识小结：</div><div>页面跳转采用返回字符串逻辑视图</div><ol><li><div>forward转发： 可以通过Model向request域中设置数据</div></li><li><div>redirect重定向： 直接写资源路径即可，虚拟目录springMVC框架自动完成拼接</div></li></ol><div><font style="color: rgb(255, 0, 0);"><br/></font></div><div><br/></div><div><span style="color: rgb(255, 0, 0);">数据存储到request域中:</span> eg: Model model </div><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>model.addAttribute(&quot;username&quot;, &quot;子慕&quot;);</div><div><br/></div><div><font color="#FF0000"><br/></font></div><div><font color="#FF0000">静态资源访问的开启:</font> 当有静态资源需要加载时，比如jquery文件，通过谷歌开发者工具抓包发现，没有加载到jquery文 件，原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是 /（缺省）,代表对所有的 静态资源都进行处理操作，这样就不会执行Tomcat内置的DefaultServlet处理，我们可以通过以下两种 方式指定放行静态资源：</div><div>方式一： 在springmvc配置文件中指定放行资源</div><div>方式二： 在springmvc配置文件中开启DefaultServlet处理静态资源</div><div><br/></div><div><br/></div><div><font style="font-size: 16pt;"><br/></font></div><div><font style="font-size: 16pt;">springmvc进阶：</font></div><div><font style="font-size: 10pt;"><br/></font></div><div>ajax异步交互： Springmvc默认用MappingJackson2HttpMessageConverter对json数据进行转换，需要加入 jackson的包.同时使用：&lt; mvc:annotation-driven / &gt;</div><div><br/></div><div>@RequestBody: 该注解用于Controller的方法的形参声明，当使用ajax提交并指定contentType为json形式时，通过 HttpMessageConverter接口转换为对应的POJO对象。</div><div><br/></div><div>@ResponseBody: 该注解用于将Controller的方法返回的对象，通过HttpMessageConverter接口转换为指定格式的数 据如：json,xml等，通过Response响应给客户端。</div><div><br/></div><div><br/></div><div><br/></div><div>RESTful: Restful是一种软件架构风格、设计风格，而不是标准，只是提供了一组设计原则和约束条件。主要用 于客户端和服务器交互类的软件，基于这个风格设计的软件可以更简洁，更有层次，更易于实现缓存机 制等。</div><div><br/></div><div><br/></div><div><br/></div><div>Restful风格的请求是使用“url+请求方式”表示一次请求目的的，HTTP 协议里面四个表示操作方式的动 词如下：</div><div><span>    </span><br/></div><ol><li><div>GET：读取（Read）</div></li><li><div>POST：新建（Create）</div></li><li><div>PUT：更新（Update）</div></li><li><div>DELETE：删除（Delete）</div></li></ol><div><br/></div><div>原来风格请求URL地址与 RESTful风格URL地址区别</div><div><br/></div><div>客户端请求                             原来风格URL地址                            RESTful风格URL地址</div><div><br/></div><div>查询所有                                     /user/findAll                                     GET /user</div><div>根据ID查询                             /user/findById?id=1                           GET /user/{1}</div><div>新增                                              /user/save                                     POST /user</div><div>修改                                           /user/update                                     PUT /user</div><div>删除                                       /user/delete?id=1                             DELETE /user/{1}</div><div><br/></div><div><br/></div><div>@PathVariable： 用来接收RESTful风格请求地址中占位符的值</div><div>@RestController： RESTful风格多用于前后端分离项目开发，前端通过ajax与服务器进行异步交互，我们处理器通常返 回的是json数据所以使用@RestController来替代@Controller和@ResponseBody两个注解。</div><div><br/></div><div><br/></div><div>文件上传：</div><div><br/></div><div>文件上传三要素</div><ol><li><div>表单项 type=&quot;file&quot;</div></li><li><div>表单的提交方式 method=&quot;POST&quot;</div></li><li><div>表单的enctype属性是多部分表单形式 enctype=“multipart/form-data&quot;</div></li></ol><div><br/></div><div>文件上传原理：</div><ol><li><div>当form表单修改为多部分表单时，request.getParameter()将失效。</div></li><li><div>当form表单的enctype取值为 application/x-www-form-urlencoded 时，</div></li><ol><li><div>form表单的正文内容格式是： name=value&amp;name=value</div></li></ol><li><div>当form表单的enctype取值为 mutilpart/form-data 时，请求正文内容就变成多部分形式：</div></li></ol><div><br/></div><div><br/></div><div>单文件上传步骤分析：</div><ol><li><div>导入fileupload和io坐标</div></li><li><div>配置文件上传解析器</div></li><li><div>编写文件上传代码</div></li></ol><div><br/></div><div><br/></div><div>异常处理：</div><div><br/></div><div>异常处理的思路：</div><div>在Java中，对于异常的处理一般有两种方式</div><ol><li><div>一种是当前方法捕获处理（try-catch），这种处理方式会造成业务代码和异常处理代码的耦合。</div></li><li><div>另一种是自己不处理，而是抛给调用者处理（throws），调用者再抛给它的调用者，也就是一直 向上抛。</div></li><ol><li><div>在这种方法的基础上，衍生出了SpringMVC的异常处理机制。</div></li></ol></ol><div><br/></div><div>系统的dao、service、controller出现都通过throws Exception向上抛出，最后由springmvc前端控 制器交由异常处理器进行异常处理</div><div>自定义异常处理器：</div><ol><li><div>创建异常处理器类实现HandlerExceptionResolver</div></li><li><div>配置异常处理器</div></li><li><div>编写异常页面</div></li><li><div>测试异常跳转</div></li></ol><div><br/></div><div>创建异常处理器类实现HandlerExceptionResolver：实现 HandlerExceptionResolver 接口         方法的参数中传递 Object handler, Exception ex</div><div>配置异常处理器：实现HandlerExceptionResolver 接口  在核心配置文件中编写：&lt; bean id=&quot;globalExecptionResovler&quot; class=&quot;com.lagou.exception.GlobalExecptionResovler&quot; &gt;&lt;/bean&gt;</div><div><br/></div><div>web的处理异常机制:</div><div><img src="springmvc笔记_files/Image.png" type="image/png" data-filename="Image.png"/></div><div><br/></div><div><br/></div><div>拦截器：</div><div>拦截器（interceptor）的作用： Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter，用于对处理器进行预处理和后处理。</div><div>将拦截器按一定的顺序联结成一条链，这条链称为拦截器链（InterceptorChain）。在访问被拦截 的方法或字段时，拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实 现。</div><div><br/></div><div><br/></div><div>拦截器和过滤器区别：</div><div><img src="springmvc笔记_files/Image [1].png" type="image/png" data-filename="Image.png"/></div><div><br/></div><div>拦截器快速入门步骤分析：</div><ol><li><div>创建拦截器类实现HandlerInterceptor接口</div></li><li><div>配置拦截器</div></li><li><div>测试拦截器的拦截效果</div></li></ol><div><br/></div><div><br/></div><div><br/></div><div>拦截器链： 开发中拦截器可以单独使用，也可以同时使用多个拦截器形成一条拦截器链。开发步骤和单个拦截器 是一样的，只不过注册的时候注册多个，注意这里注册的顺序就代表拦截器执行的顺序。</div><div><br/></div><div>拦截器中的方法说明如下：</div><div><br/></div><div><img src="springmvc笔记_files/Image [2].png" type="image/png" data-filename="Image.png"/></div><div><br/></div><div><br/></div><div><br/></div><div>SSM整合：</div><div>练习一：需求和步骤分析  使用ssm框架完成对 account 表的增删改查操作。</div><ol><li><div>准备数据库和表记录</div></li><li><div>创建web项目</div></li><li><div>编写mybatis在ssm环境中可以单独使用</div></li><li><div>编写spring在ssm环境中可以单独使用</div></li><li><div>spring整合mybatis</div></li><li><div>编写springMVC在ssm环境中可以单独使用</div></li><li><div>spring整合springMVC</div></li></ol><div><br/></div><div><br/></div><div>spring整合mybatis： 整合思想： 将mybatis接口代理对象的创建权交给spring管理，我们就可以把dao的代理对象注入到service中， 此时也就完成了spring与mybatis的整合了。</div><div>整合时需要导入整合包      spring配置文件管理mybatis（另外： 配置完后此时可以将mybatis主配置文件删除）</div><div><br/></div><div><br/></div><div><br/></div><div>spring整合springMVC： 整合思想： spring和springMVC其实根本就不用整合，本来就是一家。 但是我们需要做到spring和web容器整合，让web容器启动的时候自动加载spring配置文件，web容 器销毁的时候spring的ioc容器也销毁。</div><div><br/></div><div>spring和web容器整合：</div><div>ContextLoaderListener加载【掌握】： 可以使用spring-web包中的ContextLoaderListener监听器，可以监听servletContext容器的创建和 销毁，来同时创建或销毁IOC容器。</div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div></div></span>
</div></body></html> 